import { useEquip } from "@/stores/useEquip";
// import { managerFileInfo } from "@/apis/oss";
import { useNotification } from "@/stores/useNotification";
import { equipSocketSend } from "@/services/equip-socket";
import { baseURL } from "@/configs/jy";
import { regAIAOInverseParse } from "./parse";
import default_equip_info from "@/assets/data/default_equip_info.json";
import { deepClone, u16tobyte } from "./conversion";

// 统一设备状态
export const equipRegDataUnify = (equipRegData: Equip.EquipRegData): Equip.EquipRegData => {
    let newRegData: Equip.EquipRegData | { [propName: string]: any } = {};
    for (let key in equipRegData) {
        let newKey =
            key == "ID"
                ? "id"
                : key == "SN"
                ? "sn"
                : key == "Addr"
                ? "addr"
                : key == "AITime"
                ? "aiTime"
                : key == "AOTime"
                ? "aoTime"
                : key == "DITime"
                ? "diTime"
                : key == "DOTime"
                ? "doTime"
                : key == "SOC"
                ? "soc"
                : key == "IsOnline"
                ? "isOnline"
                : key == "IsInverse"
                ? "isInverse"
                : key == "IsTiming"
                ? "isTiming"
                : key == "IsAIValueChg"
                ? "isAIValueChg"
                : void 0;
        newKey ? (newRegData[newKey] = equipRegData[key as keyof typeof equipRegData]) : (newRegData[key] = equipRegData[key as keyof typeof equipRegData]);
    }
    return newRegData as Equip.EquipRegData;
};
export const defaultEquipInfoCheck = (equipType: Equip.EquipType, equipInfo: Equip.EquipInfo) => {
    return new Promise(async (resolve) => {
        if (equipInfo.fAIName === "") for (let i = 0; i < equipType.fAINum; i++) equipInfo.fAIName += "AI" + (i + 1) + ";";
        if (equipInfo.fAIUNIT === "") for (let i = 0; i < equipType.fAINum; i++) equipInfo.fAIUNIT += ";";
        if (equipInfo.fAIX1 === "") for (let i = 0; i < equipType.fAINum; i++) equipInfo.fAIX1 += "0;";
        if (equipInfo.fAIX2 === "") for (let i = 0; i < equipType.fAINum; i++) equipInfo.fAIX2 += "0;";
        if (equipInfo.fAIY1 === "") for (let i = 0; i < equipType.fAINum; i++) equipInfo.fAIY1 += "0;";
        if (equipInfo.fAIY2 === "") for (let i = 0; i < equipType.fAINum; i++) equipInfo.fAIY2 += "0;";
        if (equipInfo.fAlarmH === "") for (let i = 0; i < equipType.fAINum; i++) equipInfo.fAlarmL += "0;";
        if (equipInfo.fAlarmL === "") for (let i = 0; i < equipType.fAINum; i++) equipInfo.fAlarmL += "0;";
        if (equipInfo.fAOName === "") for (let i = 0; i < equipType.fAONum; i++) equipInfo.fAOName += "AO" + (i + 1) + ";";
        if (equipInfo.fAOUNIT === "") for (let i = 0; i < equipType.fAONum; i++) equipInfo.fAOUNIT += ";";
        if (equipInfo.fAOX1 === "") for (let i = 0; i < equipType.fAONum; i++) equipInfo.fAOX1 += "0;";
        if (equipInfo.fAOX2 === "") for (let i = 0; i < equipType.fAONum; i++) equipInfo.fAOX2 += "0;";
        if (equipInfo.fAOY1 === "") for (let i = 0; i < equipType.fAONum; i++) equipInfo.fAOY1 += "0;";
        if (equipInfo.fAOY2 === "") for (let i = 0; i < equipType.fAONum; i++) equipInfo.fAOY2 += "0;";
        if (equipInfo.fAOMax === "") for (let i = 0; i < equipType.fAONum; i++) equipInfo.fAOMax += "0;";
        if (equipInfo.fAOMin === "") for (let i = 0; i < equipType.fAONum; i++) equipInfo.fAOMin += "0;";
        if (equipInfo.fDIName === "") for (let i = 0; i < equipType.fDINum; i++) equipInfo.fAOMin += "DI" + (i + 1) + ";";
        if (equipInfo.fAlarmDI === "") for (let i = 0; i < equipType.fDINum; i++) equipInfo.fAOMin += "0;";
        if (equipInfo.fAlarmDIH === "") for (let i = 0; i < equipType.fDINum; i++) equipInfo.fAOMin += "0;";
        if (equipInfo.fDOName === "") for (let i = 0; i < equipType.fDONum; i++) equipInfo.fDOName += "DO" + (i + 1) + ";";
        typeof equipInfo.fAlarmType == "string" && (equipInfo.fAlarmType = JSON.parse(equipInfo.fAlarmType || "{}"));
        if (!equipInfo.fAlarmType.alarmV2) equipInfo.fAlarmType.alarmV2 = [];
        typeof equipInfo.fDODIMode == "string" && (equipInfo.fDODIMode = JSON.parse(equipInfo.fDODIMode || "{}"));
        if (!equipInfo.fDODIMode.AIIndexArr) {
            equipInfo.fDODIMode.AIIndexArr = [];
            for (let i = 0; i < equipType.fAINum; i++) equipInfo.fDODIMode.AIIndexArr.push(i);
        }
        if (!equipInfo.fDODIMode.AOIndexArr) {
            equipInfo.fDODIMode.AOIndexArr = [];
            for (let i = 0; i < equipType.fAONum; i++) equipInfo.fDODIMode.AOIndexArr.push(i);
        }
        if (!equipInfo.fDODIMode.DIIndexArr) {
            equipInfo.fDODIMode.DIIndexArr = [];
            for (let i = 0; i < equipType.fDINum; i++) equipInfo.fDODIMode.DIIndexArr.push(i);
        }
        if (!equipInfo.fDODIMode.DOIndexArr) {
            equipInfo.fDODIMode.DOIndexArr = [];
            for (let i = 0; i < equipType.fDONum; i++) equipInfo.fDODIMode.DOIndexArr.push(i);
        }
        if (!equipInfo.fDODIMode.web) equipInfo.fDODIMode.web = deepClone(default_equip_info.fDODIMode.web as typeof equipInfo.fDODIMode.web);
        if (!equipInfo.fDODIMode.web.scada) equipInfo.fDODIMode.web.scada = deepClone(default_equip_info.fDODIMode.web.scada);
        if (!equipInfo.fDODIMode.web.history) equipInfo.fDODIMode.web.history = deepClone(default_equip_info.fDODIMode.web.history);
        if (!equipInfo.fDODIMode.web.map) equipInfo.fDODIMode.web.map = deepClone(default_equip_info.fDODIMode.web.map);
        if (!equipInfo.fDODIMode.app) equipInfo.fDODIMode.app = deepClone(default_equip_info.fDODIMode.app as typeof equipInfo.fDODIMode.app);
        if (!equipInfo.fDODIMode.app.scada) equipInfo.fDODIMode.app.scada = deepClone(default_equip_info.fDODIMode.app.scada);
        if (!equipInfo.fDODIMode.app.history) equipInfo.fDODIMode.app.history = deepClone(default_equip_info.fDODIMode.app.history);
        if (!equipInfo.fDODIMode.weixin) equipInfo.fDODIMode.weixin = deepClone(default_equip_info.fDODIMode.weixin as typeof equipInfo.fDODIMode.weixin);
        if (!equipInfo.fDODIMode.weixin.scada) equipInfo.fDODIMode.weixin.scada = deepClone(default_equip_info.fDODIMode.weixin.scada);
        if (!equipInfo.fDODIMode.weixin.history) equipInfo.fDODIMode.weixin.history = deepClone(default_equip_info.fDODIMode.weixin.history);
        try {
            typeof equipInfo.fCamera == "string" && (equipInfo.fCamera = JSON.parse(equipInfo.fCamera || "[]"));
        } catch (err) {
            equipInfo.fCamera = [];
        }
        try {
            typeof equipInfo.fParam == "string" && (equipInfo.fParam = JSON.parse(equipInfo.fParam || "{}"));
        } catch (err) {
            equipInfo.fParam = deepClone(default_equip_info.fParam);
        }
        if (
            equipInfo.fParam.basicParam === void 0 ||
            equipInfo.fParam.basicParam.NetType === void 0 ||
            equipInfo.fParam.basicParam.gps === void 0 ||
            equipInfo.fParam.basicParam.isGateWay === void 0 ||
            equipInfo.fParam.basicParam.wapstyles === void 0
        )
            equipInfo.fParam = deepClone(default_equip_info.fParam);
        // const { data } = await managerFileInfo({ app: "jyems", fdir: "/common/EquipType/" + equipInfo.fEquipType + "/cfg", fname: "EquipInfo_" + equipInfo.fEquipType + ".json" });
        // if (data.code == 200 && data.data) {
        //     const cfg = JSON.parse(decodeURIComponent(atob(JSON.parse(data.data).context)));
        //     if (typeof cfg.fAIName == "object") cfg.fAIName = cfg.fAIName.join(";");
        //     if (typeof cfg.fAIUNIT == "object") cfg.fAIUNIT = cfg.fAIUNIT.join(";");
        //     if (typeof cfg.fAIX1 == "object") cfg.fAIX1 = cfg.fAIX1.join(";");
        //     if (typeof cfg.fAIX2 == "object") cfg.fAIX2 = cfg.fAIX2.join(";");
        //     if (typeof cfg.fAIY1 == "object") cfg.fAIY1 = cfg.fAIY1.join(";");
        //     if (typeof cfg.fAIY2 == "object") cfg.fAIY2 = cfg.fAIY2.join(";");
        //     if (typeof cfg.fAlarmH == "object") cfg.fAlarmH = cfg.fAlarmH.join(";");
        //     if (typeof cfg.fAlarmL == "object") cfg.fAlarmL = cfg.fAlarmL.join(";");
        //     if (typeof cfg.fAOName == "object") cfg.fAOName = cfg.fAOName.join(";");
        //     if (typeof cfg.fAOUNIT == "object") cfg.fAOUNIT = cfg.fAOUNIT.join(";");
        //     if (typeof cfg.fAOX1 == "object") cfg.fAOX1 = cfg.fAOX1.join(";");
        //     if (typeof cfg.fAOX2 == "object") cfg.fAOX2 = cfg.fAOX2.join(";");
        //     if (typeof cfg.fAOY1 == "object") cfg.fAOY1 = cfg.fAOY1.join(";");
        //     if (typeof cfg.fAOY2 == "object") cfg.fAOY2 = cfg.fAOY2.join(";");
        //     if (typeof cfg.fAOMax == "object") cfg.fAOMax = cfg.fAOMax.join(";");
        //     if (typeof cfg.fAOMin == "object") cfg.fAOMin = cfg.fAOMin.join(";");
        //     if (typeof cfg.fDIName == "object") cfg.fDIName = cfg.fDIName.join(";");
        //     if (typeof cfg.fAlarmDI == "object") cfg.fAlarmDI = cfg.fAlarmDI.join(";");
        //     if (typeof cfg.fAlarmDIH == "object") cfg.fAlarmDIH = cfg.fAlarmDIH.join(";");
        //     if (typeof cfg.fDOName == "object") cfg.fDOName = cfg.fDOName.join(";");
        // } else {
        //     for (let i = 0; i < equipType.fAINum; i++) {
        //         equipInfo.fAIName += "AI" + (i + 1) + ";";
        //         equipInfo.fAIUNIT += ";";
        //         equipInfo.fAIX1 += "0;";
        //         equipInfo.fAIX2 += "0;";
        //         equipInfo.fAIY1 += "0;";
        //         equipInfo.fAIY2 += "0;";
        //         equipInfo.fAlarmH += "0;";
        //         equipInfo.fAlarmL += "0;";
        //     }
        //     for (let i = 0; i < equipType.fAONum; i++) {
        //         equipInfo.fAOName += "AO" + (i + 1) + ";";
        //         equipInfo.fAOUNIT += ";";
        //         equipInfo.fAOX1 += "0;";
        //         equipInfo.fAOX2 += "0;";
        //         equipInfo.fAOY1 += "0;";
        //         equipInfo.fAOY2 += "0;";
        //         equipInfo.fAOMax += "0;";
        //         equipInfo.fAOMin += "0;";
        //     }
        //     for (let i = 0; i < equipType.fDINum; i++) {
        //         equipInfo.fDIName += "DI" + (i + 1) + ";";
        //         equipInfo.fAlarmDI += "0;";
        //         equipInfo.fAlarmDIH += "0;";
        //     }
        //     for (let i = 0; i < equipType.fDONum; i++) {
        //         equipInfo.fDOName += "DO" + (i + 1) + ";";
        //     }
        // }
        resolve(null);
    });
};
// 获取解析后的设备信息
export const getEquipInfo = ({ fid, funid }: { fid?: string; funid?: string }) => {
    const equipStore = useEquip();
    return equipStore.equipsInfo.find((v) => v.fID == fid || v.fUNID == funid);
};
// 发送循环读取某个设备数据
export const readCycleEquipRegData = ({ fid, funid }: { fid: string; funid?: string } | { fid?: string; funid: string } | { fid: string; funid: string }) => {
    const equipStore = useEquip();
    let equipInfo = equipStore.equipsInfo.find((v) => v.fID == fid || v.fUNID == funid);
    equipSocketSend({ infotype: "damopr", info: { opr: "read", unid: equipInfo?.fUNID, cnt: 10, cycletime: 3000 } });
};
// 读取某个设备AI、DI、DO
export const readEquipAIDIDO = ({ fid, funid }: { fid: string; funid?: string } | { fid?: string; funid: string } | { fid: string; funid: string }) => {
    const equipStore = useEquip();
    let equipInfo = equipStore.equipsInfo.find((v) => v.fID == fid || v.fUNID == funid);
    equipSocketSend({ infotype: "damread", info: { unid: equipInfo?.fUNID } });
};
// 读取所有设备AO
export const readEquipsAO = () => {
    const equipStore = useEquip();
    equipStore.equipsInfo.forEach((v) => readEquipAO({ fid: v.fID }));
};
// 读取某个设备AO
export const readEquipAO = ({ fid, funid }: { fid: string; funid?: string } | { fid?: string; funid: string } | { fid: string; funid: string }) => {
    const equipStore = useEquip();
    let equipInfo = equipStore.equipsInfo.find((v) => v.fID == fid || v.fUNID == funid);
    let equipType = equipStore.equipsType.find((v) => v.fEquipType == equipInfo?.fEquipType);
    equipType && equipInfo && equipType.fAONum && equipSocketSend({ infotype: "damopr", info: { opr: "rao", regnum: equipType.fAONum, regstart: equipType.fAOReg + 1, unid: equipInfo.fUNID } });
};
// 写入某个设备多个AO
export const writeEquipAOs = ({ fid, funid, startIndex, values }: { fid?: string; funid?: string; startIndex: number; values: (number | string)[] }) => {
    const equipStore = useEquip();
    let equipInfo = equipStore.equipsInfo.find((v) => v.fID == fid || v.fUNID == funid);
    let equipType = equipStore.equipsType.find((v) => v.fEquipType == equipInfo?.fEquipType);
    if (equipType) {
        let regstart = (equipType.fAOReg || 0) + 1 + startIndex;
        for (let i = 0; i < values.length; i++) {
            let channel = equipInfo?.dtAO?.[i + startIndex];
            if (equipInfo && channel) {
                values[i] = regAIAOInverseParse({ value: Number(values[i]), fX1: Number(channel.x1), fX2: Number(channel.x2), fY1: Number(channel.y1), fY2: Number(channel.y2) });
            }
        }
        equipInfo && equipSocketSend({ infotype: "damopr", info: { opr: "wao", aoinfo: values, regstart, unid: equipInfo.fUNID } });
    }
    const notification = useNotification();
    notification.addNotice({
        id: notification.notices.length.toString(),
        type: "event",
        title: "写入AO",
        message: "从第" + (startIndex + 1) + "个AO开始写入，值为：" + values.join(","),
        state: 0,
        date: Date.now(),
    });
};
// 写多个DO（target表示设定的目标值，2为取反）
export const writeEquipDOs = ({ fid, funid, indexs, target = 2 }: { fid?: string; funid?: string; indexs: number[]; target?: number }) => {
    const equipStore = useEquip();
    let equipInfo = equipStore.equipsInfo.find((v) => v.fID == fid || v.fUNID == funid);
    let equipType = equipStore.equipsType.find((v) => v.fEquipType == equipInfo?.fEquipType);
    let doinfo: number[] = [];
    equipInfo!.dtDO.forEach((v) => {
        let value = 2;
        if (indexs.includes(v.index)) value = target == 2 ? (v.value === null ? 2 : v.value == 0 ? 1 : 0) : target;
        doinfo[v.index] = value;
    });
    equipType && equipSocketSend({ infotype: "damopr", info: { opr: "wdo", regstart: equipType.fDOReg + 1, doinfo, unid: equipInfo?.fUNID } });
    const notification = useNotification();
    notification.addNotice({
        id: notification.notices.length.toString(),
        type: "event",
        title: "写入DO",
        message: "写入DO[" + indexs.map((v) => v + 1).join(",") + "]，值为：" + (target == 0 ? "关" : target == 1 ? "开" : "取反"),
        state: 0,
        date: Date.now(),
    });
};
// 打开DO一段时间后再关闭
export const openThenCloseDO = ({ fid, funid, index, delay }: { fid?: string; funid?: string; index: number; delay: number }) => {
    const equipStore = useEquip();
    let equipInfo = equipStore.equipsInfo.find((v) => v.fID == fid || v.fUNID == funid);
    equipInfo && equipSocketSend({ infotype: "damopr", info: { opr: "openone", io: index + 1, dly: delay, unid: equipInfo?.fUNID } });
};
// 关闭DO一段时间后再打开
export const closeThenOpenDO = ({ fid, funid, index, delay }: { fid?: string; funid?: string; index: number; delay: number }) => {
    const equipStore = useEquip();
    let equipInfo = equipStore.equipsInfo.find((v) => v.fID == fid || v.fUNID == funid);
    equipInfo && equipSocketSend({ infotype: "damopr", info: { opr: "closeone", io: index + 1, dly: delay, unid: equipInfo?.fUNID } });
};
// 循环打开关闭DO
export const loopOpenCloseDO = ({ fid, funid, index, delay }: { fid?: string; funid?: string; index: number; delay: number }) => {
    const equipStore = useEquip();
    let equipInfo = equipStore.equipsInfo.find((v) => v.fID == fid || v.fUNID == funid);
    equipInfo && equipSocketSend({ infotype: "damopr", info: { opr: "openmore", io: index + 1, dly: delay, unid: equipInfo?.fUNID } });
};
export const wirteAdjustAI = ({ funid, aiNum, adjustAI }: { funid: string; aiNum: number; adjustAI: Equip.AdjustAI[] }) => {
    let rst: number[] = [];
    for (let i = 0; i < (adjustAI.length || 0); i++) {
        rst.push(...[...u16tobyte(adjustAI[i].mode), ...u16tobyte(adjustAI[i].down), ...u16tobyte(adjustAI[i].up)]);
    }
    let strrst = "";
    let ascii = "0123456789ABCDEF";
    for (let i = 0; i < aiNum * 3 * 2; i++) {
        strrst += ascii.charAt((rst[i] >> 4) & 0x0f);
        strrst += ascii.charAt((rst[i] >> 0) & 0x0f);
    }
    equipSocketSend({ infotype: "damopr", info: { opr: "waohex", unid: funid, regstart: 3301, aoinfos: strrst } });
};
// 获取设备图标的绝对路径
export const getEquipImageURL = (funid: string = "", img: string = "ab00.png") => {
    if (!img.startsWith("http")) {
        if (img.startsWith("/jyapp/")) return baseURL + img;
        let url = "";
        img === "" && (img = "ab00.png");
        let fimgType = img.substring(0, 3);
        if (fimgType == "img") url = baseURL + "/jyapp/jyems/equip/" + funid + "/image/" + img;
        else if (fimgType == "Img") url = baseURL + "/jyapp/jyems/equip/JYUNID_" + funid + "/image/" + img;
        else if (fimgType == "com") url = baseURL + "/jyapp/jyems/common/image/" + img;
        else url = baseURL + "/cdn/image/jycloud/equip/" + img;
        return url;
    } else return img;
};
// 获取需要展示的设备数据
export const getShowValue = (value: number, x1: number, x2: number, y1: number, y2: number = 1000) => {
    if (x1 != x2 && y1 != y2) {
        let num = Math.abs(y1) > Math.abs(y2) ? Math.abs(y1) : Math.abs(y2);
        if (num <= 10) return value.toFixed(3);
        else if (num <= 100) return value.toFixed(2);
        else if (num <= 1000) return value.toFixed(1);
        else if (num <= 10000) return value.toFixed(0);
        else return value.toFixed(0);
    }
    return value.toFixed(0);
};
// 仅保留资源的最后部分，例："https://xxx/xxx.png" => "xxx.png"
export const sliceSrc = (src: string, isDelete = false) => {
    if (!src.includes("/")) return src;
    else if (src.includes("/jyapp/jyems/equip/") && !isDelete) return src;
    else return src.match(/\/([^\/]*)$/)?.[1] || "";
};
